#include"MemLRU.h"
MemLRU::MemLRU(int capa)
: _capacity(capa)
{}
void MemLRU::put(int key, string value)
    {
        //在unordered_map查看key是否存在
        auto it = _um.find(key);
        //key是存在的
        if(it != _um.end())
        {
            //更新list中key对应的value值
            it->second->second = value;
            //将key转换到_nodes的最前面，作为最新的元素
            _nodes.splice(_nodes.begin(), _nodes, it->second);
        }
        //key是不存在的
        else
        {
            //list的元素的个数是不是达到了上限
            if(_capacity == (int)_nodes.size())
            {
                //获取最后一个元素
                auto deleteNode = _nodes.back();
                //在list中删除最尾部的元素
                _nodes.pop_back();
                //再将该元素从unordered_map中删除
                /* _um.erase(deleteNode.first);//使用key进行删除 */
                _um.erase(_um.find(deleteNode.first));//使用迭代器进行删除

            }
            //将元素key-value插入到list的最前面
            _nodes.push_front({key, value});
            //以及存放在unordered_map
            _um.insert({key, _nodes.begin()});
        }
    }

    string MemLRU::get(int key)
    {
        //在unordered_map查看key是否存在
        auto it = _um.find(key);
        if(it == _um.end())
        {
            return string();
        }
        else
        {
            //将key转换到_nodes的最前面，作为最新的元素
            _nodes.splice(_nodes.begin(), _nodes, it->second);
            return it->second->second;
        }
    }
    
    void MemLRU::print() const
    {
        for(auto &elem : _nodes)
        {
            cout << "(" << elem.first 
                 << ", " << elem.second
                 <<") ";
        }
        cout << endl;
    }